package cn.edu.zzu;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;

public class GeneratorCode {

    public static void main(String[] args) {


        //代码自动成器
        AutoGenerator autoGenerator = new AutoGenerator();

        //1.全局配置
        GlobalConfig gc = new GlobalConfig();
        String path = System.getProperty("user.dir");
        gc.setOutputDir(path+"/src/main/java");//输出文件目录
        gc.setAuthor("zzu");//作者
        gc.setOpen(false);//是否打开文件目录
        gc.setFileOverride(false); //是否覆盖
        gc.setIdType(IdType.ID_WORKER);//主键生成策略 雪花算法
        gc.setDateType(DateType.ONLY_DATE);//日期字段
        gc.setServiceName("%sService");//去除Service的I前缀
        gc.setSwagger2(true);//是否开启api文档注释

        autoGenerator.setGlobalConfig(gc);

        //2.数据源
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
        dataSourceConfig.setUrl("jdbc:mysql:///db01?characterEncoding=UTF-8&useSSL=false&useUnicode=true");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("123456");
        dataSourceConfig.setDbType(DbType.MYSQL);//设置数据库类型

        autoGenerator.setDataSource(dataSourceConfig);

        //3.包的配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setModuleName("test");//模块名称
        packageConfig.setParent("cn.edu.zzu");//父目录
        packageConfig.setEntity("entity");//实体类包名
        packageConfig.setMapper("mapper");//Mapper的包名
        packageConfig.setService("service");//Service的包名
        packageConfig.setServiceImpl("service.impl");//Impl类路径
        packageConfig.setController("controller");//Controller的包名

        autoGenerator.setPackageInfo(packageConfig);


//====================================================================================================
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return path + "/src/main/resources/mapper/" + packageConfig.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        /*
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建
                checkDir("调用默认方法创建的目录，自定义目录用");
                if (fileType == FileType.MAPPER) {
                    // 已经生成 mapper 文件判断存在，不想重新生成返回 false
                    return !new File(filePath).exists();
                }
                // 允许生成模板文件
                return true;
            }
        });
        */
        cfg.setFileOutConfigList(focList);
        autoGenerator.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        // templateConfig.setEntity("templates/entity2.java");
        // templateConfig.setService();
        // templateConfig.setController();

        templateConfig.setXml(null);
        autoGenerator.setTemplate(templateConfig);
//====================================================================================================


        //4.策略配置
        StrategyConfig strategyConfig = new StrategyConfig();

        strategyConfig.setInclude("dept");//设置要映射的包名
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);//下划线赚驼峰
        strategyConfig.setEntityLombokModel(true);//lomnok插件
        strategyConfig.setLogicDeleteFieldName("deleted");//逻辑删除字段
        strategyConfig.setChainModel(true);//链式编程

        //自动填充配置  自动填充字段的填充策略设置
        TableFill gmt_create = new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gmt_modified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmt_create);
        tableFills.add(gmt_modified);

        strategyConfig.setTableFillList(tableFills);//自动填充配置

        //乐观锁
        strategyConfig.setVersionFieldName("version");//乐观锁字段
        strategyConfig.setRestControllerStyle(true);//restfull风格
        strategyConfig.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2

        autoGenerator.setStrategy(strategyConfig);

        autoGenerator.execute();//执行
    }
}
